﻿using System.Globalization;
using RestSharp;
using Twitch.Net.Clients;
using Twitch.Net.Helpers;
using Twitch.Net.Model;

namespace BlogsAPI.Sites
{
    using System;
    using System.Text.RegularExpressions;
    using Abstract;
    using System.Diagnostics;

    /// <summary>
    /// Игровые стриминги
    /// </summary>
    [BlogServiceAPI(Description = "http://www.twitch.tv", Link = "http://www.twitch.tv")]
    public class Twitch : BlogServer
    {
        private static readonly Regex Validation = new Regex(@"^https?://(?:(?:www|player)\.)?twitch\.tv/", Regexoptions);
        private static readonly Regex ValidationFull = new Regex(@"^https?://(?:(?:www|player)\.)?twitch\.tv/(?:\?channel=)?([-_\w]+)(?:\s|/|#|$)", Regexoptions);

        [DebuggerStepThrough]
        public Twitch()
        {
        }

        #region interface: BlogServer

        /// <summary>
        /// проверка, является ли передаваемый урл чатью этого сервиса
        /// </summary>
        public override Boolean ValidateLink(String sLink)
        {
            return Validation.Match(sLink).Success;
        }

        /// <summary>
        /// проверка, является ли передаваемый урл частью этого сервиса
        /// </summary>
        /// <remarks>BlogType всегда вернется как User</remarks>
        public override Boolean ValidateLink(String sLink, out String userName, out BlogType bType)
        {
            bType = BlogType.Unknown;
            Match m = ValidationFull.Match(sLink);
            if (m.Success)
            {
                bType = BlogType.User;
                userName = m.Groups[1].ToString();
            }
            else
            {
                userName = String.Empty;
            }
            return m.Success;
        }

        /// <summary>
        /// http://www.t30p.ru/Twitch.aspx
        /// </summary>
        public override bool HasRating
        {
            get { return true; }
        }

        /// <summary>
        /// Получение ссылки на блог блогера
        /// </summary>
        /// <param name="userName">ник блогера</param>
        /// <param name="bt">Тип блога - сообщество или блог</param>
        public override String GetBlogLink(string userName, BlogType bt)
        {
            return String.Format("http://twitch.tv/{0}", userName);
        }

        /// <summary>
        /// Получение ссылки на rss-блогера 
        /// По умолчанию, грузим блог и извлекаем ссылку
        /// </summary>
        /// <param name="userName">ник блогера</param>
        /// <param name="btype">Тип блога - сообщество или блог</param>
        /// <returns>Link on RSS feed</returns>
        public override string GetRssLink(string userName, BlogType btype)
        {
            return String.Empty;
        }

        #endregion

        private static TwitchStaticReadOnlyClient _twitchClient;

        /// <summary>
        /// Статический клиент для запросов
        /// </summary>
        private TwitchStaticReadOnlyClient twitchClient
        {
            get
            {
                if (_twitchClient == null)
                {
                    var _restClient = new RestClient("https://api.twitch.tv/kraken");
                    _restClient.AddHandler("application/json", new DynamicJsonDeserializer());
                    _restClient.AddDefaultHeader("Accept", "application/vnd.twitchtv.v3+json");
                    _restClient.AddDefaultParameter("client_id", "m5ollhnyzqx70roe40gpe2r7vi5y62f", ParameterType.QueryString);
                    Func<string, Method, IRestRequest> requestFunc = (url, method) => new RestRequest(url, method);
                    var wrappedClient = new TwitchReadOnlyClient(_restClient, requestFunc);
                     _twitchClient = new TwitchStaticReadOnlyClient(wrappedClient);
                }
                return _twitchClient;
            }
        }

        /// <summary>
        /// Получение информации о канале
        /// </summary>
        /// <returns>объект с данными</returns>
        public Channel GetChannel(string channelName)
        {
            try
            {
                return twitchClient.GetChannel(channelName);
            }
            catch (Exception e1)
            {
                Debug.Write(e1);
            }
            return null;
        }

        /// <summary>
        /// Получение ссылки на картинку аватара
        /// </summary>
        /// <param name="userName">имя канала(!)</param>
        /// <returns></returns>
        public override string ExtractAvatar(string userName, BlogType bt)
        {
            var cnl = GetChannel(userName);
            //если нет, то картинка по умолчанию
            return cnl.Logo;
        }

        /// <summary>
        /// Получение активных стримов
        /// </summary>
        /// <param name="count">Количество видео вернуть</param>
        /// <param name="lang">Язык трансляции</param>
        /// <returns>объект с данными</returns>
        public TwitchList<Stream> GetActiveStreams(PagingInfo paging = null, CultureInfo lang = null)
        {
            try
            {
                return twitchClient.GetStreams(null,null, paging??new PagingInfo() {PageSize = 100}, null,null, lang);
            }
            catch (Exception e1)
            {
                Debug.Write(e1);
            }
            return null;
        }
    }
}